package com.example.word.util;


import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.example.word.dto.TemplateDTO;
import com.example.word.enums.FontSizeEnum;
import com.example.word.enums.LineSpacingEnum;
import com.spire.doc.*;
import com.spire.doc.documents.DocumentObjectType;
import com.spire.doc.documents.Paragraph;
import com.spire.doc.documents.TextSelection;

import com.spire.doc.fields.DocPicture;
import lombok.extern.log4j.Log4j2;
import org.springframework.beans.factory.annotation.Value;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Stack;

/**
 * 文件工具类
 *
 * @author yuwen
 * @date 2023/3/30
 */
@Log4j2
public class FileUtils {
    private static Stack<Integer> stack;


    /**
     * 文章格式进行对比
     * @param path 测试文档路径
     * @param templateDTO 已获取模板格式的对象templateDTO
     * @return
     */
    public static String FileCompare(String path, TemplateDTO templateDTO) {
        stack = new Stack<>();
        Document doc = new Document();
        doc.loadFromFile(path);
        //遍历section
        for (int i = 0; i < doc.getSections().getCount(); i++) {
            if(doc.getSections().getCount() > 1 && i == 0){
                i = 1;
            }
            Section section = doc.getSections().get(i);
            //顶部页边距
            double top = section.getPageSetup().getMargins().getTop();
            //底部页边距
            double bottom = section.getPageSetup().getMargins().getBottom();
            if (templateDTO.getPageMarginT() != top) {
                section.getParagraphs().get(0).appendComment("顶部页边距不符合要求，大小应为" + templateDTO.getPageMarginT());
            }
            if (templateDTO.getPageMarginB() != bottom) {
                section.getParagraphs().get(section.getParagraphs().getCount() - 1).appendComment("底部页边距不符合要求，大小应为" + templateDTO.getPageMarginB());
            }
            for(int tableIndex = 0; tableIndex < section.getTables().getCount(); tableIndex++){
                if(templateDTO.getHorizontalAlignTable() == null){
                    break;
                }
                if(section.getTables().get(0).getTableFormat().getHorizontalAlignment().getValue() != templateDTO.getHorizontalAlignTable()){
                    TableRow tableRow = section.getTables().get(tableIndex).addRow(true, 1);
                    if (templateDTO.getHorizontalAlignTable() == 0) {
                        tableRow.getCells().get(0).addParagraph().appendText("需要左对齐");
                    } else if (templateDTO.getHorizontalAlignTable() == 1) {
                        tableRow.getCells().get(0).addParagraph().appendText("需要居中");
                    } else if (templateDTO.getHorizontalAlignTable() == 2) {
                        tableRow.getCells().get(0).addParagraph().appendText("需要右对齐");
                    }
                }
            }
            //遍历Paragraph
            for (int j = 0; j < section.getParagraphs().getCount(); j++) {
                Paragraph paragraph = section.getParagraphs().get(j);
                for (int m = 0; m < paragraph.getChildObjects().getCount() && j < section.getParagraphs().getCount() - 1; m++) {
                    DocumentObject docobj = paragraph.getChildObjects().get(m);
                    if (docobj.getDocumentObjectType()== DocumentObjectType.Picture)
                    {
                        DocPicture picture = (DocPicture) docobj ;
                        Paragraph image_p = picture.getOwnerParagraph();
                        int align = image_p.getFormat().getHorizontalAlignment().getValue();
                        if(templateDTO.getAlignImage() == null){
                            break;
                        }
                        //图片对齐方式对比
                        if(align != templateDTO.getAlignImage()){
                            if (templateDTO.getAlignImage() == 1) {
                                paragraph.appendComment("需要居中");
                            } else if (templateDTO.getAlignImage() == 2) {
                                paragraph.appendComment("需要右对齐");
                            } else if (templateDTO.getAlignImage() == 0) {
                                paragraph.appendComment("需要左对齐");
                            }else if(templateDTO.getAlignImage() == 3){
                                paragraph.appendComment("需要两端对齐");
                            }
                        }
                        //图片标题大小与字体名称
                        String text = section.getParagraphs().get(j + 1).getText();
                        if(StringUtils.isBlank(text) || text.equals(" ") || templateDTO.getAlignImageT() == null){
                            continue;
                        }
                        int alignT = section.getParagraphs().get(j + 1).getFormat().getHorizontalAlignment().getValue();
                        TextSelection textSelection = doc.findString(section.getParagraphs().get(j + 1),text, false, false);
                        String fontName = textSelection.getAsOneRange().getCharacterFormat().getFontNameFarEast();
                        float fontSize = textSelection.getAsOneRange().getCharacterFormat().getFontSize();

                        if(alignT != templateDTO.getAlignImageT()){
                            if (templateDTO.getAlignImageT() == 1) {
                                section.getParagraphs().get(j + 1).appendComment("需要居中");
                            } else if (templateDTO.getAlignImageT() == 2) {
                                section.getParagraphs().get(j + 1).appendComment("需要右对齐");
                            } else if (templateDTO.getAlignImageT() == 0) {
                                section.getParagraphs().get(j + 1).appendComment("需要左对齐");
                            }else if(templateDTO.getAlignImageT() == 3){
                                section.getParagraphs().get(j + 1).appendComment("需要两端对齐");
                            }
                        }
                        if(!fontName.equals(templateDTO.getImageTName())){
                            section.getParagraphs().get(j + 1).appendComment("图片标题名称应为："+templateDTO.getImageTName());
                        }
                        if(fontSize != templateDTO.getImageTSize()){
                            section.getParagraphs().get(j + 1).appendComment("图片标题大小应为："+FontSizeEnum.getFontName(templateDTO.getImageTSize()));
                        }
                        j++;
                    }
                }
                if (paragraph.getText() == null || paragraph.getText().isEmpty() || paragraph.getText().equals(" ")) continue;

                //获取标题
                //从当前段落位置向下寻找字符串
                TextSelection textSelection = doc.findString(section.getParagraphs().get(j),paragraph.getText().trim(), false, true);

                if (paragraph.getFormat().getOutlineLevel().getValue() == 0)//段落为“标题1”的内容
                {
                    if(!judgeTitle(0)){
                        paragraph.appendComment("标题出现逻辑错误");
                    }
                    if(templateDTO.getAlignHFirst() == null){
                        continue;
                    }

                    //左对齐3 居中 1 右对齐 2 对齐方式
                    int align = paragraph.getFormat().getHorizontalAlignment().getValue();
                    //一级标题字体名称
                    String fontName = textSelection.getAsOneRange().getCharacterFormat().getFontNameFarEast();
                    //一级标题字体大小
                    float fontSize = textSelection.getAsOneRange().getCharacterFormat().getFontSize();

                    if(fontSize != templateDTO.getSizeHFirst()){
                        paragraph.appendComment("一级标题字体大小应为："+ FontSizeEnum.getFontName(templateDTO.getSizeHFirst()));
                    }
                    if(!fontName.equals(templateDTO.getNameHFirst())){
                        paragraph.appendComment("一级标题字体名称应为："+templateDTO.getNameHFirst());
                    }

                    if(align != templateDTO.getAlignHFirst()){
                        if (templateDTO.getAlignHFirst() == 1) {
                            paragraph.appendComment("需要居中");
                        } else if (templateDTO.getAlignHFirst() == 2) {
                            paragraph.appendComment("需要右对齐");
                        } else if (templateDTO.getAlignHFirst() == 0) {
                            paragraph.appendComment("需要左对齐");
                        }else if(templateDTO.getAlignHFirst() == 3){
                            paragraph.appendComment("需要两端对齐");
                        }
                    }
                    continue;
                }
                //获取标题
                if (paragraph.getFormat().getOutlineLevel().getValue() == 1)//段落为“标题2”的内容
                {
                    if(!judgeTitle(1)){
                        paragraph.appendComment("标题出现逻辑错误");
                    }
                    if(templateDTO.getAlignHSecond() == null){
                        continue;
                    }
                    //左对齐3 居中 1 右对齐 2 对齐方式
                    int align = paragraph.getFormat().getHorizontalAlignment().getValue();
                    //二级标题字体名称
                    String fontName = textSelection.getAsOneRange().getCharacterFormat().getFontNameFarEast();
                    //二级标题字体大小
                    float fontSize = textSelection.getAsOneRange().getCharacterFormat().getFontSize();
                    if(fontSize != templateDTO.getSizeHSecond()){
                        paragraph.appendComment("二级标题字体大小应为："+ FontSizeEnum.getFontName(templateDTO.getSizeHSecond()));
                    }
                    if(!fontName.equals(templateDTO.getNameHSecond())){
                        paragraph.appendComment("二级标题字体名称应为："+templateDTO.getNameHSecond());
                    }
                    if(align != templateDTO.getAlignHSecond()){
                        if (templateDTO.getAlignHSecond() == 1) {
                            paragraph.appendComment("需要居中");
                        } else if (templateDTO.getAlignHSecond() == 2) {
                            paragraph.appendComment("需要右对齐");
                        } else if (templateDTO.getAlignHSecond() == 0) {
                            paragraph.appendComment("需要左对齐");
                        }else if(templateDTO.getAlignHSecond() == 3){
                            paragraph.appendComment("需要两端对齐");
                        }
                    }
                    continue;
                }
                //获取标题
                if (paragraph.getFormat().getOutlineLevel().getValue() == 2)//段落为“标题3”的内容
                {
                    if(!judgeTitle(2)){
                        paragraph.appendComment("标题出现逻辑错误");
                    }
                    if(templateDTO.getAlignHThird() == null){
                        continue;
                    }
                    //左对齐3 居中 1 右对齐 2 对齐方式
                    int align = paragraph.getFormat().getHorizontalAlignment().getValue();
                    //三级标题字体名称
                    String fontName = textSelection.getAsOneRange().getCharacterFormat().getFontNameFarEast();
                    //三级标题字体大小
                    float fontSize = textSelection.getAsOneRange().getCharacterFormat().getFontSize();
                    if(fontSize != templateDTO.getSizeHThird()){
                        paragraph.appendComment("三级标题字体大小应为："+FontSizeEnum.getFontName(templateDTO.getSizeHThird()));
                    }
                    if(!fontName.equals(templateDTO.getNameHThird())){
                        paragraph.appendComment("三级标题字体名称应为："+templateDTO.getNameHThird());
                    }
                    if(align != templateDTO.getAlignHThird()){
                        if (templateDTO.getAlignHThird() == 1) {
                            paragraph.appendComment("需要居中");
                        } else if (templateDTO.getAlignHThird() == 2) {
                            paragraph.appendComment("需要右对齐");
                        } else if (templateDTO.getAlignHThird() == 0) {
                            paragraph.appendComment("需要左对齐");
                        }else if(templateDTO.getAlignHThird() == 3){
                            paragraph.appendComment("需要两端对齐");
                        }
                    }
                    continue;

                }
                //获取标题
                if (paragraph.getFormat().getOutlineLevel().getValue() == 3)//段落为“标题4”的内容
                {
                    if(!judgeTitle(3)){
                        paragraph.appendComment("标题出现逻辑错误");
                    }
                    if(templateDTO.getAlignHFourth() == null){
                        continue;
                    }
                    //左对齐3 居中 1 右对齐 2 对齐方式
                    int align = paragraph.getFormat().getHorizontalAlignment().getValue();
                    //四级标题字体名称
                    String fontName = textSelection.getAsOneRange().getCharacterFormat().getFontNameFarEast();
                    //四级标题字体大小
                    float fontSize = textSelection.getAsOneRange().getCharacterFormat().getFontSize();
                    if(fontSize != templateDTO.getSizeHFourth()){
                        paragraph.appendComment("四级标题字体大小应为："+ FontSizeEnum.getFontName(templateDTO.getSizeHFourth()));
                    }
                    if(!fontName.equals(templateDTO.getNameHFourth())){
                        paragraph.appendComment("四级标题字体名称应为："+templateDTO.getNameHFourth());
                    }
                    if(align != templateDTO.getAlignHFourth()){
                        if (templateDTO.getAlignHFourth() == 1) {
                            paragraph.appendComment("需要居中");
                        } else if (templateDTO.getAlignHFourth() == 2) {
                            paragraph.appendComment("需要右对齐");
                        } else if (templateDTO.getAlignHFourth() == 0) {
                            paragraph.appendComment("需要左对齐");
                        }else if (templateDTO.getAlignHFourth() == 3) {
                            paragraph.appendComment("需要两端对齐");
                        }
                    }
                    continue;

                }
                if (paragraph.getFormat().getOutlineLevel().getValue() == 9)//正文内容
                {
                    if(templateDTO.getNameText().equals(" ") || templateDTO.getNameText() == null){
                        continue;
                    }
                    float lineSpacing = paragraph.getFormat().getLineSpacing();
                    //首行缩进大小
                    float indent = paragraph.getFormat().getFirstLineIndent();
                    //正文字体名称
                    String fontName = textSelection.getAsOneRange().getCharacterFormat().getFontNameFarEast();

                    //正文字体大小
                    float fontSize = textSelection.getAsOneRange().getCharacterFormat().getFontSize();

                    if(lineSpacing != templateDTO.getLineSpacing()){
                        paragraph.appendComment("行距应为："+ LineSpacingEnum.getSpacingName(templateDTO.getLineSpacing()));
                    }
                    if (!fontName.equals(templateDTO.getNameText())){
                        paragraph.appendComment("正文字体名称应为："+templateDTO.getNameText());
                    }
                    if(fontSize != templateDTO.getSizeText()){
                        paragraph.appendComment("正文字体大小应为："+FontSizeEnum.getFontName(templateDTO.getSizeText()));
                    }
                    if(indent == 0){
                        paragraph.appendComment("首行未缩进或未使用格式缩进");
                    }else if(indent != fontSize * 2){
                        paragraph.appendComment("首行缩进大小不是两个字符");
                    }
                    continue;
                }
                if(paragraph.getStyleName().matches("ListParagraph")){
                    if(templateDTO.getSizeList() == null){
                        continue;
                    }
                    //列表字体名称
                    String fontName = textSelection.getAsOneRange().getCharacterFormat().getFontNameFarEast();
                    //列表字体大小
                    float fontSize = textSelection.getAsOneRange().getCharacterFormat().getFontSize();
                    if(fontName != templateDTO.getNameList()){
                        paragraph.appendComment("列表字体名称应为: " + templateDTO.getNameList());
                    }
                    if(fontSize != templateDTO.getSizeList()){
                        paragraph.appendComment("列表字体大小应为："+FontSizeEnum.getFontName(templateDTO.getSizeList()));
                    }
                }
            }
        }
        String s = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date());

        doc.saveToFile("/usr/local/upload/word/"+s+"错误报告.doc");
        String path2 = "http://43.138.10.161:8083/word/" +s+"错误报告.doc";
//        doc.saveToFile("D:/111/" + s + "_" + "错误报告.doc");
//        String path2 = "D:/111/" + s + "错误报告.doc";
        return path2;
    }

//    public static void checkTitle(TextSelection textSelection, Paragraph paragraph, TemplateDTO templateDTO) {
//        if(judgeTitle(paragraph.getFormat().getOutlineLevel().getValue()) == -1){
//            paragraph.appendComment("标题定义格式错误");
//        }
//        //左对齐3 居中 1 右对齐 2 对齐方式
//        int align = paragraph.getFormat().getHorizontalAlignment().getValue();
//        //一级标题字体名称
//        String fontName = textSelection.getAsOneRange().getCharacterFormat().getFontNameFarEast();
//        //一级标题字体大小
//        float fontSize = textSelection.getAsOneRange().getCharacterFormat().getFontSize();
//
//        if(fontSize != templateDTO.getSizeHFirst()){
//            paragraph.appendComment("一级标题字体大小应为："+ FontSizeEnum.getFontName(templateDTO.getSizeHFirst()));
//        }
//        if(!fontName.equals(templateDTO.getNameHFirst())){
//            paragraph.appendComment("一级标题字体名称应为："+templateDTO.getNameHFirst());
//        }
//        switch (align) { //使用switch语句对齐方式进行判断
//            case 0: //左对齐
//                if (templateDTO.getAlignHFirst() == 3) {
//                    paragraph.appendComment("需要两端对齐");
//                }
//                break;
//            case 1: //居中
//                if (templateDTO.getAlignHFirst() != 1) {
//                    paragraph.appendComment("需要居中");
//                }
//                break;
//            case 2: //右对齐
//                if (templateDTO.getAlignHFirst() != 2) {
//                    paragraph.appendComment("需要右对齐");
//                }
//                break;
//            case 3: //两端对齐
//                if (templateDTO.getAlignHFirst() != 3) {
//                    paragraph.appendComment("需要左对齐");
//                }
//                break;
//            default:
//                break;
//        }
//    }

    /**
     *
     * 判断标题是否按照格式定义
     * @param val
     * @return
     */
    public static boolean judgeTitle(Integer val) {
        if (!stack.isEmpty() && stack.peek() + 1 >= val) {
            stack.push(val);
            return true;
        } else if (val == 0) {
            stack.push(val);
        } else {
            stack.push(val);
            return false;
        }
        return true;
    }



//    /**
//     * 获取文件md5值
//     *
//     * @param inputStream 文件输入流
//     * @return {@link String} 文件md5值
//     */
//    public static String getMd5(InputStream inputStream) {
//        try {
//            MessageDigest md5 = MessageDigest.getInstance("md5");
//            byte[] buffer = new byte[8192];
//            int length;
//            while ((length = inputStream.read(buffer)) != -1) {
//                md5.update(buffer, 0, length);
//            }
//            return new String(Hex.encodeHex(md5.digest()));
//        } catch (Exception e) {
//            e.printStackTrace();
//            return null;
//        } finally {
//            try {
//                if (inputStream != null) {
//                    inputStream.close();
//                }
//            } catch (IOException e) {
//                e.printStackTrace();
//            }
//        }
//    }
//
//    /**
//     * 得到文件扩展名
//     *
//     * @param fileName 文件名称
//     * @return {@link String} 文件后缀
//     */
//    public static String getExtName(String fileName) {
//        if (StringUtils.isBlank(fileName)) {
//            return "";
//        }
//        return fileName.substring(fileName.lastIndexOf("."));
//    }
//
//    /**
//     * 转换file
//     *
//     * @param multipartFile 多部分文件
//     * @return {@link File} file
//     */
//    public static File multipartFileToFile(MultipartFile multipartFile) {
//        File file = null;
//        try {
//            String originalFilename = multipartFile.getOriginalFilename();
//            String[] filename = Objects.requireNonNull(originalFilename).split("\\.");
//            file = File.createTempFile(filename[0], filename[1]);
//            multipartFile.transferTo(file);
//            file.deleteOnExit();
//        } catch (IOException e) {
//            e.printStackTrace();
//        }
//        return file;
//    }
//
//
//    /**
//     * 自动调节精度(经验数值)
//     *
//     * @param size 源图片大小
//     * @return 图片压缩质量比
//     */
//    private static double getAccuracy(long size) {
//        double accuracy;
//        if (size < 900) {
//            accuracy = 0.85;
//        } else if (size < 2048) {
//            accuracy = 0.6;
//        } else if (size < 3072) {
//            accuracy = 0.44;
//        } else {
//            accuracy = 0.4;
//        }
//        return accuracy;
//    }

}
